package com.example.ruiji.util;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.example.ruiji.dao.CategoryMapper;
import com.example.ruiji.pojo.Category;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
@Component
public class CategoryListener
        implements ReadListener<Category> {

    /**
     * 每隔5条存储数据库，实际使用中可以100条，然后清理list ，方便内存回收
     */
    private static final int BATCH_COUNT = 100;

    /**
     * 缓存数据
     */
    private List<Category> cache = ListUtils
            .newArrayListWithExpectedSize(BATCH_COUNT);

    /**
     * 假设这个是一个DAO，
     * 当然有业务逻辑这个也可以是一个service。
     * 当然如果不用存储这个对象没用。
     */


    @Override
    public void invoke(Category goodsDto, AnalysisContext analysisContext) {

        cache.add(goodsDto);
        // 达到BATCH_COUNT了，需要去存储一次数据库，
        // 防止数据几万条数据在内存，容易OOM
        if (cache.size() >= BATCH_COUNT) {
            saveData();
            // cache置为空List，方便gc work
            cache = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }

    }
    @Autowired
    private CategoryMapper categoryMapper;
    private void saveData() {
        System.out.println("开始存储数据数数据：" + cache.size());
        categoryMapper.insertlist(cache);

    }

    /**
     * @param analysisContext 所有数据处理完，调用这里
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //  这里也要保存数据，
        //  确保最后遗留的数据也存储到数据库
        System.out.println("最终数据存储:");
        saveData();
        System.out.println("所有数据解析完成!");
    }

}


